package cn.tedu.charging.order.controller;

import cn.tedu.charging.common.pojo.JsonResult;
import cn.tedu.charging.order.pojo.param.OrderAddParam;
import cn.tedu.charging.order.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RequestMapping("/order")
@RestController
@Api(tags = "订单接口")
public class OrderController {

    /**
     * Dto 数据传输对象 前端把数据传输给了后端的Controller
     * 服务器之间调用 A服务 调用 B服务 A和B都是后端服务
     * Dto 是A 和 B之间传递数据的载体
     * Param 前端调用后端
     * 从功能上讲 用一个 O 来表示各层的传输对象是没有问题
     * 为了解耦 把每层都独立处理
     * 创建订单 OrderAddParam OrderCreateParam
     * 更新订单 OrderUpdateParam
     * 查询订单 OrderQueryParam
     *
     * RESTFul 接口定义的方法的规范
     * 希望接口按照 http的请求方式 POST GET PUT DELETE
     * 来处理 资源 R resource
     * CRUD
     * R read  get 查询
     * C create post 新增
     * U update put 修改
     * D delete delete 删除
     *
     * 调用方法 退化简化 只用 GET POST
     * 查询 GET
     * 增加 修改 删除 POST
     *
     * 接口URL 改如何定义?
     * 资源/动作  动作/资源
     * creatOrder 驼峰命名
     * C 创建订单 /order/create
     * R 查询订单列表 /order/list  查询订单详情 /order/detail
     * U 修改订单 /order/update
     * D 删除订单 /order/delete/{orderNo}
     *
     * @return
     */

    @Autowired
    private OrderService orderService;

    @ApiOperation("创建订单")
    @PostMapping("create")
    public JsonResult<String> createOrder(@RequestBody OrderAddParam orderAddParam) throws Exception {
        log.info("创建订单:入参:{}",orderAddParam);
        //创建类型的接口 是否返回出参,要根据业务来决定
        //创建订单接口 订单详情接口
        //业务要求 创建订单后需要跳转到订单详情接口
        //创建订单接口 的出参 应该返回 订单号
        //订单号 作为 订单详情接口的入参
        log.info("创建订单:调用creatOrder{}",orderAddParam);
        String orderNo = orderService.createOrder(orderAddParam);
        log.debug("创建订单:调用createOrder入参:{},出参:{}",orderAddParam,orderNo);
//        JsonResult<String> jsonResult = new JsonResult<>();
//        jsonResult.setCode(2000); //统一状态码 2000表示成功
//        jsonResult.setData(orderNo);
//        jsonResult.setMessage("创建订单成功");//一般消息在报错的时候返回
//        return jsonResult;
        JsonResult<String> result = JsonResult.ok(orderNo, "创建订单成功");
        log.debug("创建订单:入参:{},结果:{}",orderAddParam,result);
        //code 返回的是2000 表示成功 后端工程师和前端工程师在联调完成,测试在测试功能
        //测试说 创建订单 失败了 然后把这个问题 抛到到你们联调群 截图 弹窗 创建订单失败
        //后端工程师 猜 是后端的问题 因为什么 结果返回了message 前端弹窗的内容是 message
        //有可能前端 正常代码 if(code == 2000 ) {alert(message)}
        // 有可能代码 if(code == 2000 ) {alert("创建订单失败")}
        return result;
    }
}
